问题
先来看一个反例:
private final List<Cheese> cheesesInStock = ...; public Cheese[] getCheeses(){ if (cheesesInStock.size == 0) return null; }
调用方客户端代码:
Cheese[] cheeses = shop.getCheeses(); if(cheeses != null && Arrays.asList(cheeses).contains(Cheese.STILTON)){ System.out.println("Jolly good,just the thing.") ; }
也就是说由于cheesesInStock在特殊情况下返回了null,因此,给调用方增加了额外的判断为null的代码,而从业务意义上来说,null一般是指异常情况下的返回值,那么,针对返回值为集合或者数组来说,特殊情况下应该返回什么?
解决
对于方法如果返回为null,则调用方每一次都要去判断是否为null,从而解决NullPointException。因此,方法返回类型是数组或者集合时,特殊情况不应该返回null,而是应该返回一个空的集合或者数组。
有时候会有人认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。这种观点是站不住脚的,原因有两点。第一这个级别上担心性能问题是不明智的,除非分析表明这个方法正是造成性能问题的真正源头。第二每次都返回同一个零长度数组有可能的,因为零长度数组是不可变的,而不可变的对象有可能被自由的共享。
将上例进行修改:
public List<Cheese> getCheeseList(){ if(cheeseInStock.isEmpt()) return Collections.emptyList();//Always return same list else return new ArrayList<Cheese>(cheesesInStock); }
结论
返回类型为数组或者集合的方法没理由返回null,而应该返回一个长度为零的数组或者集合。